﻿// SerialDataParser.cs

using System.Text;

namespace SerialInput;

public abstract class SerialDataParser
{
    /// <summary>
    /// 解析串口数据
    /// </summary>
    public static ParsedData ParseSerialData(byte[] data, string encodingName = "UTF-8")
    {
        var result = new ParsedData();
        try
        {
            Encoding encoding;
            try
            {
                encoding = Encoding.GetEncoding(encodingName);
            }
            catch
            {
                encoding = Encoding.UTF8; // 默认回退
            }

            // UTF-8解码
            var decodedString = encoding.GetString(data).Trim('\r', '\n', '\0');
            result.RawText = decodedString;

            if (string.IsNullOrEmpty(decodedString))
                return result;

            // 如果是简单的扫码数据（不包含参数格式）
            if (!decodedString.Contains(':') && !decodedString.Contains(','))
            {
                result.DisplayText = decodedString;
                result.Parameters["BARCODE"] = decodedString;
                return result;
            }

            // 解析参数格式的数据 (P1:value,P2:value,...)
            // var parameters = new Dictionary<string, string>();
            // string[] parts = decodedString.Split(',');
            //
            // foreach (string part in parts)
            // {
            //     if (part.Contains(':'))
            //     {
            //         int colonIndex = part.IndexOf(':');
            //         string key = part.Substring(0, colonIndex).Trim();
            //         string value = part.Substring(colonIndex + 1).Trim();
            //         parameters[key] = value;
            //     }
            // }
            //
            // result.Parameters = parameters;
            // result.DisplayText = ExtractDisplayText(parameters);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"数据解析错误: {ex.Message}");
            result.DisplayText = "解析错误";
        }

        return result;
    }

    /// <summary>
    /// 提取显示文本
    /// </summary>
    private static string ExtractDisplayText(Dictionary<string, string> parameters)
    {
        if (parameters.ContainsKey("BARCODE"))
        {
            return parameters["BARCODE"];
        }

        // 对于参数格式，提取主要信息
        var displayParts = new List<string>();

        // 优先显示P1（通常是主要标识）
        if (parameters.ContainsKey("P1") && !string.IsNullOrEmpty(parameters["P1"]))
            displayParts.Add(parameters["P1"]);

        // 然后显示P3（通常是描述信息）
        if (parameters.ContainsKey("P3") && !string.IsNullOrEmpty(parameters["P3"]))
            displayParts.Add(parameters["P3"]);

        // 如果没有找到主要信息，返回第一个非空值
        if (displayParts.Count == 0)
        {
            foreach (var kvp in parameters)
            {
                if (!string.IsNullOrEmpty(kvp.Value))
                {
                    displayParts.Add(kvp.Value);
                    break;
                }
            }
        }

        return displayParts.Count > 0 ? string.Join(" - ", displayParts) : "扫码数据";
    }
}

/// <summary>
/// 解析结果类
/// </summary>
public class ParsedData
{
    public string RawText { get; set; } = "";
    public string DisplayText { get; set; } = "";
    public Dictionary<string, string> Parameters { get; set; } = new();
}